home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / networking / ip / ka9q / MNetsrc.hqx / Mac TCP_IP Source v.33 / mac_callbk.c < prev    next >
Text File  |  1989-03-16  |  11KB  |  375 lines

  1. /* PROGRAM mac_callbk.c */
  2. /* This program will read the Callbook Database for TCP/IP sessions */
  3.  
  4. /****************************************************/
  5. /*                  HISTORY                         */
  6. /*                                                  */
  7. /* JAN  9 1989  KGS - original release              */
  8. /* JAN 12 1989  KGS - added raw mode                */
  9. /* FEB  9 1989  DLH - changed to support TCP/IP     */
  10. /****************************************************/
  11.  
  12. #include <stdio.h>
  13. #include <ctype.h>
  14. #include "global.h"
  15. #include "config.h"
  16. #ifdef CALLBK
  17. #include "callbook.h"
  18. #include "timer.h"
  19. #include "mbuf.h"
  20. #include "internet.h"
  21. #include "icmp.h"
  22. #include "netuser.h"
  23. #include "tcp.h"
  24.  
  25. extern FILE    *cbklfp;
  26. extern FILE *cbkfp;
  27. extern char *logtime();
  28. static char record [RECORD_LENGTH];
  29. static char log_string[80];
  30. static char out_string[80];
  31. static long line_number = 0;
  32. static int ftflag = 0;
  33. static long callbook_size = 0;
  34.  
  35. mac_callbk(tcb,who)
  36.     struct tcb    *tcb;        /* tcb to send on */
  37.     char *who;
  38. {
  39.  
  40.     if (cbkfp == NULLFILE) { /* open database */
  41.         sprintf(out_string,"Unable to process TCP/IP Callbook Server request.\015\012");
  42.         sndmsg(tcb,out_string);
  43.         return;
  44.     }
  45.     if (ftflag)
  46.         goto getcall;
  47.             
  48.     fseek(cbkfp,0L,2);    /* seek to end of file */
  49.     callbook_size = ftell(cbkfp);    /* this is file size */
  50.     ftflag = 1;            /* set the flag for first time initialization */
  51.  
  52. getcall:
  53.     who++;
  54.     uppercase(who,who);
  55.     binary_search(who, CALLSIGN_START, CALLSIGN_LEN, callbook_size, tcb);
  56.     return;
  57. }
  58.  
  59. static
  60. print_log() /* send log output to file */
  61. {
  62.     if(cbklfp == NULLFILE)
  63.         return;            /* return if no log file */
  64.       fprintf (cbklfp, "%s", log_string);
  65. } /* end print_log */
  66.  
  67. static
  68. binary_search(string, start, length, callbook_size, tcb)
  69. int  start;
  70. int  length;
  71. char string[RECORD_LENGTH];
  72. long callbook_size;
  73. struct tcb    *tcb;        /* tcb to send on */
  74.  
  75. {
  76. int   i           = 0;
  77. long  low         = 0;
  78. long  middle      = 0;
  79. long  high        = 0;
  80. int   modified    = 0;
  81. char callsign_mod[CALLSIGN_LEN];
  82. static char spaces[] = "        ";
  83.  
  84.   for (i = 0; i < strlen(string); i++) { /* mod callsign to match database */
  85.     if (isdigit (string[i])) {
  86.       strcpy (callsign_mod, (string + i));
  87.       strncat (callsign_mod, spaces, length - strlen(string));
  88.       strncat (callsign_mod, string, i);
  89.       ++modified;
  90.     }
  91.   }
  92.   if (!modified) {
  93.     strcpy(callsign_mod,string); /* special case with no numbers */
  94.   }
  95.   high = callbook_size / RECORD_LENGTH; /* how many records in database */
  96.   do {
  97.     middle = (low + high) / 2;
  98.     fseek (cbkfp, (middle * RECORD_LENGTH), 0);
  99.     fgets (record,RECORD_LENGTH,cbkfp);
  100.     ++line_number;
  101.     if (strncmp(callsign_mod, (record + start), CALLSIGN_LEN) < 0) {
  102.       high = middle - 1;
  103.     }
  104.     else {
  105.       if (strncmp(callsign_mod, (record + start), CALLSIGN_LEN) > 0) {
  106.         low = middle + 1;
  107.       }
  108.     }
  109.   }
  110.   while ((strncmp(callsign_mod, (record + start), CALLSIGN_LEN) != 0) && (low <= high));
  111.   if (low <= high) {
  112.       sprintf(log_string,"[%s] TCP/IP Callbook request by %s for %s.\n",
  113.                   logtime(),psocket(&tcb->conn.remote),string);
  114.     print_log();
  115.     format(tcb);
  116.   }
  117.   else {
  118.       sprintf(log_string,"[%s] TCP/IP Callbook request by %s for %s not completed.\n",
  119.                   logtime(),psocket(&tcb->conn.remote),string);
  120.     print_log();
  121.     sprintf(out_string,"Callbook record NOT found for ->%s<-.\015\012",string);
  122.     sndmsg(tcb,out_string);
  123.   }
  124. } /* end binary_search */
  125.  
  126. static
  127. uppercase(to, from)
  128. char *to;
  129. char *from;
  130.  
  131. {  /* copys a lower case string to uppercase */
  132.    while (strncmp (from, "\0", 1) != 0) {
  133.     if (islower(*from)) { /* if lower case, copy as uppercase */
  134.       *to = toupper(*from);
  135.     }
  136.     else {
  137.       *to = *from; /* already uppercase, copy as is */
  138.     }
  139.     if (strncmp (to, "_", 1) == 0) { /* convert underscore to space */
  140.       strncpy (to, " ", 1);
  141.     }
  142.     ++to;
  143.     ++from;
  144.   }
  145.   *to = *from; /* copy \0 at end of string */
  146. } /* end uppercase */
  147.  
  148. static
  149. format(tcb)
  150.     struct tcb    *tcb;        /* tcb to send on */
  151. {
  152. char string[RECORD_LENGTH];
  153. char mod_string[RECORD_LENGTH];
  154. static char eos[] = "\0"; /* end of string char */
  155. char *string_end,*zip;
  156.  
  157.     sprintf(out_string,"\015\012"); /* insure we start on a new line */
  158.     sndmsg(tcb,out_string);
  159.     strncpy (string, (record + FIRST_NAME_START), FIRST_NAME_LEN);
  160.     strcpy ((string + FIRST_NAME_LEN), eos);
  161.     rm_whitespace(string);
  162.     sprintf(out_string,"Name:              %.11s",string);
  163.     sndmsg(tcb,out_string);
  164.     strncpy (string, (record + MIDDLE_INIT_START), MIDDLE_INIT_LEN);
  165.     strcpy ((string + MIDDLE_INIT_LEN), eos);
  166.     rm_whitespace(string);
  167.     sprintf(out_string," %.1s. ",string);
  168.     sndmsg(tcb,out_string);
  169.     strncpy (string, (record + LAST_NAME_START), LAST_NAME_LEN);
  170.     strcpy ((string + LAST_NAME_LEN), eos);
  171.     rm_whitespace(string);
  172.     sprintf(out_string,"%.20s ",string);
  173.     sndmsg(tcb,out_string);
  174.     strncpy (string, (record + LAST_NAME_SUFF_START), LAST_NAME_SUFF_LEN);
  175.     strcpy ((string + LAST_NAME_SUFF_LEN), eos);
  176.     rm_whitespace(string);
  177.     sprintf(out_string,"%s\015\012",string);
  178.     sndmsg(tcb,out_string);
  179.  
  180.     strncpy (string, (record + CALLSIGN_START), CALLSIGN_LEN);
  181.     strcpy ((string + CALLSIGN_LEN), eos);
  182.     string_end = (string + strlen (string)) - 1; /* fix the callsign so it */
  183.     while (strncmp (string_end, " ", 1) != 0) {  /* is readable */
  184.       --string_end;
  185.     }
  186.     strcpy (mod_string, (string_end + 1));
  187.     strncat (mod_string, string, ((strlen (string)) -(strlen (string_end))));
  188.     rm_whitespace(mod_string);
  189.     sprintf(out_string,"License:           %.8s ",mod_string);
  190.     sndmsg(tcb,out_string);
  191.     strncpy (string, (record + LICENSE_CLASS_START), LICENSE_CLASS_LEN);
  192.     strcpy ((string + LICENSE_CLASS_LEN), eos);
  193.     rm_whitespace(string);
  194.     sprintf(out_string,"           License Class: %s\015\012",string);
  195.     sndmsg(tcb,out_string);
  196.  
  197.     strncpy (string, (record + MAIL_ADRS_START), MAIL_ADRS_LEN);
  198.     strcpy ((string + MAIL_ADRS_LEN), eos);
  199.     rm_whitespace(string);
  200.     sprintf(out_string,"Mail address:      %s, ",string);
  201.     sndmsg(tcb,out_string);
  202.     strncpy (string, (record + MAIL_ADRS_CTY_START), MAIL_ADRS_CTY_LEN);
  203.     strcpy ((string + MAIL_ADRS_CTY_LEN), eos);
  204.     rm_whitespace(string);
  205.     sprintf(out_string,"%s, ",string);
  206.     sndmsg(tcb,out_string);
  207.     strncpy (string, (record + MAIL_ADRS_ST_START), MAIL_ADRS_ST_LEN);
  208.     strcpy ((string + MAIL_ADRS_ST_LEN), eos);
  209.     rm_whitespace(string);
  210.     sprintf(out_string,"%s ",string);
  211.     sndmsg(tcb,out_string);
  212.     strncpy (string, (record + MAIL_ADRS_ZIP_START), MAIL_ADRS_ZIP_LEN);
  213.     strcpy ((string + MAIL_ADRS_ZIP_LEN), eos);
  214.     rm_whitespace(string);
  215.     sprintf(out_string,"%.5s-%.4s\015\012",string,
  216.             zip = "0000");
  217.     sndmsg(tcb,out_string);
  218.  
  219.     strncpy (string, (record + STA_ADRS_START), STA_ADRS_LEN);
  220.     strcpy ((string + STA_ADRS_LEN), eos);
  221.     rm_whitespace(string);
  222.     sprintf(out_string,"Station address:   %s, ",string);
  223.     sndmsg(tcb,out_string);
  224.     strncpy (string, (record + STA_ADRS_CTY_START), STA_ADRS_CTY_LEN);
  225.     strcpy ((string + STA_ADRS_CTY_LEN), eos);
  226.     rm_whitespace(string);
  227.     sprintf(out_string,"%s, ",string);
  228.     sndmsg(tcb,out_string);
  229.     strncpy (string, (record + STA_ADRS_ST_START), STA_ADRS_ST_LEN);
  230.     strcpy ((string + STA_ADRS_ST_LEN), eos);
  231.     rm_whitespace(string);
  232.     sprintf(out_string,"%s\015\012",string);
  233.     sndmsg(tcb,out_string);
  234.  
  235.     strncpy (string, (record + EFFECTIVE_START), EFFECTIVE_LEN);
  236.     strcpy ((string + EFFECTIVE_LEN), eos);
  237.     rm_whitespace(string);
  238.     date (string);
  239.     sprintf(out_string,"Effective date:    %s ",string);
  240.     sndmsg(tcb,out_string);
  241.     strncpy (string, (record + EXPIRATION_START), EXPIRATION_LEN);
  242.     strcpy ((string + EXPIRATION_LEN), eos);
  243.     rm_whitespace(string);
  244.     date (string);
  245.     sprintf(out_string," Expiration date: %s\015\012",string);
  246.     sndmsg(tcb,out_string);
  247.  
  248.     strncpy (string, (record + PREVIOUS_CALLSIGN_START), PREVIOUS_CALLSIGN_LEN);
  249.     strcpy ((string + PREVIOUS_CALLSIGN_LEN), eos);
  250.     rm_whitespace(string);
  251.     sprintf(out_string,"Previous Callsign: %.8s",string);
  252.     sndmsg(tcb,out_string);
  253.     strncpy (string, (record + PREVIOUS_CLASS_START), PREVIOUS_CLASS_LEN);
  254.     strcpy ((string + PREVIOUS_CLASS_LEN), eos);
  255.     rm_whitespace(string);
  256.     sprintf(out_string,"        Previous Class: %s\015\012",string);
  257.     sndmsg(tcb,out_string);
  258.  
  259.     strncpy (string, (record + BIRTH_START), BIRTH_LEN);
  260.     strcpy ((string + BIRTH_LEN), eos);
  261.     rm_whitespace(string);
  262.     date (string);
  263.     sprintf(out_string,"Birthdate:         %.13s ",string);
  264.     sndmsg(tcb,out_string);
  265.     strncpy (string, (record + PROCESS_START), PROCESS_LEN);
  266.     strcpy ((string + PROCESS_LEN), eos);
  267.     rm_whitespace(string);
  268.     date (string);
  269.     sprintf(out_string,"    Process date: %s\015\012\015\012",string);
  270.     sndmsg(tcb,out_string);
  271. }
  272.  
  273. static
  274. rm_whitespace(string)
  275. char *string;
  276. {
  277. int i = 0;
  278. static char eos[] = "\0"; /* end of string char */
  279. char *string_end;
  280.  
  281.   string_end = (string + strlen (string)) - 1;
  282.   while (strncmp (string_end, " ", 1) == 0) {
  283.     --string_end;
  284.   }
  285.   strcpy ((string_end + 1), eos);
  286. }
  287.  
  288. static
  289. date(string)
  290. char *string;
  291. {
  292. int day = 0;
  293. int month = 0;
  294. int year = 0;
  295. int leap = 0;
  296. char temp_string[RECORD_LENGTH];
  297. static char eos[] = "\0";
  298. static int days_per_month [2][13] = {
  299.     {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
  300.     {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
  301.     };
  302.  
  303.   day = atoi(string + 2); /* get the day of year */
  304.   strcpy ((string + 2), eos);
  305.   year = atoi(string); /* get the year */
  306.   if (year < THISYEAR + 10) {
  307.     year += 1900;
  308.   }
  309.   else {
  310.     year += 1800;
  311.   }
  312.   leap = year%4 == 0 && year%100 != 0 || year%400 == 0;
  313.   for (month = 1; day > days_per_month [leap][month]; month++) {
  314.     day -= days_per_month [leap][month];
  315.   }
  316.  
  317.   switch (month) {
  318.     case 1 :
  319.       strcpy(string, "Jan.");
  320.       break;
  321.  
  322.     case 2 :
  323.       strcpy(string, "Feb.");
  324.       break;
  325.  
  326.     case 3 :
  327.       strcpy(string, "Mar.");
  328.       break;
  329.  
  330.     case 4 :
  331.       strcpy(string, "Apr.");
  332.       break;
  333.  
  334.     case 5 :
  335.       strcpy(string, "May");
  336.       break;
  337.  
  338.     case 6 :
  339.       strcpy(string, "Jun.");
  340.       break;
  341.  
  342.     case 7 :
  343.       strcpy(string, "Jul.");
  344.       break;
  345.  
  346.     case 8 :
  347.       strcpy(string, "Aug.");
  348.       break;
  349.  
  350.     case 9 :
  351.       strcpy(string, "Sep.");
  352.       break;
  353.  
  354.     case 10 :
  355.       strcpy(string, "Oct.");
  356.       break;
  357.  
  358.     case 11 :
  359.       strcpy(string, "Nov.");
  360.       break;
  361.  
  362.     case 12 :
  363.       strcpy(string, "Dec.");
  364.       break;
  365.  
  366.     default :
  367.       sprintf (log_string,"Invalid month ->%d<- .\n", month);
  368.       print_log ();
  369.       break;
  370.   }
  371.   sprintf (temp_string,"%s %d, %d", string, day, year);
  372.   strcpy (string, temp_string);
  373. }
  374. #endif
  375.